from flask import get_flashed_messages, request, flash, render_template, redirect, url_for, session
from models.rol import metadata, Rol
from models.database import db_session
import sys
#import bz2

from models.rolManager import RolManager
from models.faseManager import FaseManager
from models.proyectoManager import ProyectoManager
from models.permisoManager import PermisoManager

permisoMgr = PermisoManager()
proyectoMgr = ProyectoManager()
rolMgr = RolManager()
faseMgr = FaseManager()

"""
Clase que contiene los metodos relacionados con la gestion de roles del sistema
"""

def abmRol():
    """ Metodo encargado de la gestion de roles """
    filtro=""
    if request.method == "POST":
        idproyecto = request.form["idproyecto"]
        filtro = request.form["filtro"]
        proyecto = proyectoMgr.getProyecto(idproyecto)
        return paginarRol(idproyecto, proyecto, 1, filtro)
    if request.method == "GET":
        if session['idproyecto']:
            if request.args.getlist("filtro"):
                filtro = request.args.getlist("filtro")[0]
            pagina = 1
            if request.args.getlist("pagina"):
                pagina = request.args.getlist("pagina")[0]
            idproyecto = session['idproyecto']
            proyecto = proyectoMgr.getProyecto(idproyecto)
            return paginarRol(idproyecto, proyecto,pagina , filtro)
        else:
            flash(u"Seleccionar un proyecto antes de realizar la operaci\u00f3n", "error")
            return redirect(url_for("configurarProyecto", action="abmRol"))

def crearRol():
    """ Metodo encargado de guardar un rol """
    
    if request.method == "POST":
        nombre = request.form["nombre"]
        idproyecto = request.form["idproyecto"]
        descripcion = request.form["descripcion"]
        idfase = request.form["idfase"]
        fase = faseMgr.getFase(idfase)
        rol = Rol(nombre, descripcion, fase)
        idpermisos = request.form.getlist("check")
        permisos =[]
        for i in xrange(0, len(idpermisos)):
            permiso = permisoMgr.getPermiso(idpermisos[i])
            permisos.append(permiso)
        rol.permisos = permisos
        rolMgr.guardarRol(rol)
        return redirect(url_for("abmRol", idproyecto=idproyecto, filtro = request.form["filtro"]))
    else:
        idproyecto = request.args.getlist("idproyecto")[0]
        fases = faseMgr.getFasesPorProyecto(idproyecto)
        permisos = permisoMgr.getPermisos()
        return render_template("crearRol.html", permisos = permisos, fases = fases, idproyecto=idproyecto, rol = request.form, filtro = request.args.getlist("filtro")[0])

def modificarRol():
    session = db_session()
    """ Metodo encargado de modificar un rol """
    
    if request.method == "GET":
        idrol = request.args.getlist("idrol")[0]
        rol = rolMgr.getRol(idrol)
        idproyecto = request.args.getlist("idproyecto")[0]
        fases = faseMgr.getFasesPorProyecto(idproyecto)
        
        permisos = permisoMgr.getPermisos()
        permisos = permisos.all()
        for permisoAsig in rol.permisos:
            permisos.remove(permisoAsig)
        
        return render_template("modificarRol.html", permisos=permisos,fases = fases, idproyecto=idproyecto, rol = rol, filtro = request.args.getlist("filtro")[0] )
    if request.method == "POST":
        idrol = request.form["idrol"]
        rol = rolMgr.getRol(idrol)
        rol.nombre = request.form["nombre"]
        rol.descripcion = request.form["descripcion"]
        idfase = request.form["idfase"]
        fase = faseMgr.getFase(idfase)
        rol.fase = fase
        idpermisos = request.form.getlist("check")
        permisos =[]
        for i in xrange(0, len(idpermisos)):
            permiso = permisoMgr.getPermiso(idpermisos[i])
            permisos.append(permiso)
        rol.permisos = permisos
        rolMgr.guardarRol(rol)
        idproyecto = request.form["idproyecto"]
        mensajes = get_flashed_messages(with_categories= True)
        categoria, mensaje = mensajes[0]
        if categoria == "error":
            flash(mensaje, categoria)
        else:
            flash("Modificado exitosamente");
        return redirect(url_for("abmRol", idproyecto=idproyecto, filtro = request.form["filtro"]))

def eliminarRol():
    """ Metodo encargado de eliminar un rol """
    
    if request.method == "POST":
        idrol = request.form["idrol"]
        rolMgr.eliminarRol(idrol)
        idproyecto = request.form["idproyecto"]
        flash("Rol eliminado exitosamente")
        return redirect(url_for("abmRol", idproyecto=idproyecto, filtro= request.form["filtro"]))
    if request.method == "GET":
        idrol = request.args.getlist("idrol")[0]
        rol = rolMgr.getRol(idrol);
        idproyecto = request.args.getlist("idproyecto")[0]
        return render_template("eliminarRol.html", idproyecto=idproyecto, filtro= request.args.getlist("filtro")[0], rol = rol)

def consultarRol():
    """ Metodo encargado de consultar los datos de un rol """
    
    if request.method == "GET":
        idrol = request.args.getlist("idrol")[0]
        rol = rolMgr.getRol(idrol)
        idproyecto = request.args.getlist("idproyecto")[0]
        return render_template("consultarRol.html", idproyecto=idproyecto, rol = rol, filtro = request.args.getlist("filtro")[0])
    else:
        idproyecto = request.form["idproyecto"]
        return redirect(url_for("abmRol", idproyecto=idproyecto, filtro = request.form["filtro"]))

def paginarRol(idproyecto, proyecto, pagina, filtro):
    """ Metodo encargado de la busqueda de usuarios a partir de un filtro """
    porPagina= 5
    pagina = int(pagina)
    total = rolMgr.getRolesPaginado(idproyecto, nombre=filtro, desde=None, hasta=None)
    if total % porPagina == 0:
        cantPaginas= total/porPagina
    else:
        resto = total % porPagina
        subtotal = (total-resto)
        cantPaginas= (subtotal/porPagina) + 1
    hasta = pagina * porPagina
    desde = hasta - porPagina
    roles = rolMgr.getRolesPaginado(idproyecto, filtro, desde, hasta)
    return render_template("abmRol.html", lista = roles, idproyecto = idproyecto, proyecto =proyecto,\
        filtro = filtro, form=request.form, primera=1, ultima= cantPaginas, ant= pagina-1,\
        sig=pagina +1, cantPaginas = cantPaginas, pagina = pagina)
  
